// GroupChatSessionDetailWidget.h
// Created by Limou on 24-9-23.
// 群聊会话详细信息弹窗

#ifndef FRONTEND_GROUPCHATSESSIONDETAILWIDGET_HPP
#define FRONTEND_GROUPCHATSESSIONDETAILWIDGET_HPP

#include <QDialog>
#include <QIcon>
#include <QVBoxLayout>
#include <QGridLayout>
#include <QScrollArea>
#include <QWidget>
#include <QPushButton>
#include <QIcon>
#include "../../common/Common.hpp"
#include "../../model/UserModel.hpp"

// TODO: 可以迁移
namespace chat_system::subassembly {
    class GroupChatSessionDetailWidgetItem : public QWidget {
        Q_OBJECT
        // 组件
        QPushButton* userBtn_; // 好友按钮
        QLabel* userLab_; // "好友" 标签

        // 布局
        QVBoxLayout* vLayoutOfSelf_;

        // 数据
        model::UserModel userModel_;

    public:
        // 构造方法
        explicit GroupChatSessionDetailWidgetItem(const model::UserModel& userModel, QWidget* parent = nullptr)
        : QWidget(parent)
        , userBtn_(new QPushButton(this))
        , userLab_(new QLabel(this))
        , vLayoutOfSelf_(new QVBoxLayout())
        , userModel_(userModel) {
            this->setElement(); // 设置组件
            this->setElementSize(); // 设置组件尺寸
            this->setElementStyle(); // 设置组件样式
            this->setElementLayout(); // 设置组件布局
            this->setElementSignalSlot(); // 设置组件信号槽
            this->setElementData(); // 设置组件数据
        }

        // 析构方法
        ~GroupChatSessionDetailWidgetItem() override = default;

    private:
        // 设置组件方法
        void setElement() {
            userBtn_->setIcon(userModel_.getUserAvatarIco());
            userLab_->setText(userModel_.getUserNickName());
            userLab_->setAlignment(Qt::AlignCenter);
        }

        // 设置组件大小方法
        void setElementSize() {
            this->setFixedSize(QSize(50, 70));
            userBtn_->setFixedSize(QSize(45, 45));
            userBtn_->setIconSize(QSize(45, 45));
            userLab_->setFixedSize(QSize(45, 45));
        }

        // 设置组件样式方法
        void setElementStyle() {
            // 提前设置好 lab 的样式
            QString labStyle =
                    "QLabel {"
                    "font-size: 10px;"
                    "font-weight: 500;"
                    "border: none;"
                    "background-color: transparent;"
                    "color: black;"
                    "}";

            userLab_->setStyleSheet(labStyle);
        }

        // 设置组件布局方法
        void setElementLayout() {
            vLayoutOfSelf_->addWidget(userBtn_, Qt::AlignCenter, Qt::AlignCenter);
            vLayoutOfSelf_->addWidget(userLab_, Qt::AlignCenter, Qt::AlignCenter);
            this->setLayout(vLayoutOfSelf_);
        }

        // 设置信号槽方法
        void setElementSignalSlot() {

        }

        // 设置数据处理方法
        void setElementData() {

        }
    };
}

// >>> class GroupChatSessionDetailWidget begin: 描述了一个群聊会话的详细弹窗 >>>
namespace chat_system::subassembly {
    class GroupChatSessionDetailWidget : public QDialog {
    Q_OBJECT
        // 组件
        QScrollArea* scrollArea_;
        QWidget* container_;
        QPushButton* exitGroupBtn_; // 退出群聊按钮
        QLabel* groupNameTag_; // "群聊名称" 标签
        QLabel* groupNameLab_; // 群聊名称内容标签
        QLineEdit* groupNameEdit_; // 群聊名称编辑框
        QPushButton* groupNameModifyBtn_; // 提交群聊名称按钮
        QPushButton* groupNameSubmitBtn_; // 提交群聊名称按钮

        // 布局
        QGridLayout* gLayoutOfContainer_;

        // 数据
        model::UserModel groupUserModel_; // 存储群聊信息
        QHash<QString, model::UserModel> memberList_; // 存储多个成员
        int rowOfGLayoutOfContainer_; // 布局行
        int colOfGLayoutOfContainer_; // 布局列

    public:
        // 构造方法
        explicit GroupChatSessionDetailWidget(const model::UserModel& groupUserModel)
        : QDialog()
        , scrollArea_(new QScrollArea(this))
        , container_(new QWidget(this))
        , exitGroupBtn_(new QPushButton(this))
        , groupNameTag_(new QLabel(this))
        , groupNameLab_(new QLabel(this))
        , groupNameEdit_(new QLineEdit(this))
        , groupNameModifyBtn_(new QPushButton(this))
        , groupNameSubmitBtn_(new QPushButton(this))
        , gLayoutOfContainer_(new QGridLayout())
        , groupUserModel_(groupUserModel)
        , rowOfGLayoutOfContainer_(0)
        , colOfGLayoutOfContainer_(0) {
            this->setElement(); // 设置组件
            this->setElementSize(); // 设置组件尺寸
            this->setElementStyle(); // 设置组件样式
            this->setElementLayout(); // 设置组件布局
            this->setElementSignalSlot(); // 设置组件信号槽
            this->setElementData(); // 设置组件数据
        }

        // 析构方法
        ~GroupChatSessionDetailWidget() override = default;

    public:
        // 添加群聊新成员方法
        void addMember(GroupChatSessionDetailWidgetItem* groupChatSessionDetailWidgetItem) {
            gLayoutOfContainer_->addWidget(groupChatSessionDetailWidgetItem, rowOfGLayoutOfContainer_, colOfGLayoutOfContainer_);
            ++colOfGLayoutOfContainer_;
            if (colOfGLayoutOfContainer_ >= 5) {
                ++rowOfGLayoutOfContainer_;
                colOfGLayoutOfContainer_ = 0;
            }
        }

    private:
        // 设置组件方法
        void setElement() {
            // 设置整体组件
            this->setWindowTitle("群聊详情");
            QIcon windowIcon(":/window/window_main/logo.png");
            if (windowIcon.isNull()) { common::Tools::getInstance()->getLogger()->warn("DoubleChatSessionDetailWidget(): windowIcon is null"); }
            this->setWindowIcon(windowIcon);
            this->setAttribute(Qt::WA_DeleteOnClose);
            this->move(QCursor::pos()); // 默认移动到鼠标的位置

            // 设置滚动条
            scrollArea_->setWidgetResizable(true);
            scrollArea_->setWidget(container_);
            scrollArea_->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);

            // 设置退出按钮
            exitGroupBtn_->setText("退出群聊");

            // 提前设置 mod 按钮的图标
            auto modifyBtnIcon = QIcon(":subassembly/modify.png");
            if (modifyBtnIcon.isNull()) { common::Tools::getInstance()->getLogger()->warn("SelfInfoWidget(): modifyBtnIcon is null"); }

            // 提前设置 sub 按钮的图标
            auto submitBtnIcon = QIcon(":subassembly/submit.png");
            if (submitBtnIcon.isNull()) { common::Tools::getInstance()->getLogger()->warn("SelfInfoWidget(): submitBtnIcon is null"); }

            // 设置 "群聊名称" 标签
            groupNameTag_->setText("群聊名称");
            groupNameTag_->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);

            // 设置群聊名称内容标签
            groupNameLab_->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
            groupNameLab_->setText(groupUserModel_.getUserNickName());

            // 设置群聊名称编辑框
            groupNameEdit_->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
            groupNameEdit_->hide(); // 暂时不显示出来

            // 设置修改群聊名称按钮
            groupNameModifyBtn_->setIcon(modifyBtnIcon);

            // 设置提交群聊名称按钮
            groupNameSubmitBtn_->setIcon(submitBtnIcon);
            groupNameSubmitBtn_->hide(); // 暂时不显示出来
        }

        // 设置组件大小方法
        void setElementSize() {
            this->setFixedSize(QSize(300, 400));
            scrollArea_->setFixedSize(QSize(270, 300));
            exitGroupBtn_->setFixedSize(QSize(80, 30));

            // 提前设置 tag 的尺寸
            QSize tagSize(60, 30);
            // 提前设置 lab 的尺寸
            int labSize = 20;
            // 提前设置 mod 按钮的尺寸
            QSize modBtnAndSubBtnSize(20, 20);
            // 提前设置 sub 按钮的尺寸
            QSize subBtnAndSubBtnSize(20, 20);

            groupNameTag_->setFixedSize(tagSize);
            groupNameTag_->setFixedHeight(labSize);
            groupNameEdit_->setFixedHeight(labSize);
            groupNameModifyBtn_->setFixedSize(modBtnAndSubBtnSize);
            groupNameModifyBtn_->setIconSize(modBtnAndSubBtnSize);
            groupNameSubmitBtn_->setFixedSize(subBtnAndSubBtnSize);
            groupNameSubmitBtn_->setIconSize(subBtnAndSubBtnSize);
        }

        // 设置组件样式方法
        void setElementStyle() {
            scrollArea_->setStyleSheet(
                    "QScrollArea {"
                    "border: none;"
                    "background-color: transparent;"
                    "}");
            scrollArea_->verticalScrollBar()->setStyleSheet(
                "QScrollBar:vertical {"
                "width: 5px;"
                "background-color: transparent;"
                "}"
                "QScrollBar::handle:vertical {"
                "background: rgb(46, 46, 46);"
                "}"
                "QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical {"
                "background: transparent;"
                "}"
            );
            scrollArea_->horizontalScrollBar()->setStyleSheet("QScrollBar:horizontal { height: 0px }"); // 选择垂直方向滚动条样式进行设置, 禁止显示垂直方向的滚动条
            container_->setStyleSheet("QWidget { border: none; } ");
            exitGroupBtn_->setStyleSheet(
                    "QPushButton {"
                    "color: red;"
                    "border: none;"
                    "font-size: 15px;"
                    "background-color: rgb(233, 233, 233);"  // 默认背景颜色
                    "border-radius: 5px;"
                    "}"
                    "QPushButton:hover {"
                    "background-color: rgb(210, 210, 210);"  // 鼠标悬停时的背景颜色
                    "}"
                    "QPushButton:pressed {"
                    "background-color: rgb(198, 198, 198);"  // 鼠标按下时的背景颜色
                    "}"
            );

            this->setStyleSheet(
                    "QDialog {"
                    "background-color: rgb(254, 254, 254);"
                    "}"
            );

            // 提前设置好 tag 的样式
            QString tagStyle =
                    "QLabel {"
                    "font-size: 14px;"
                    "font-weight: 800;"
                    "border: none;"
                    "background-color: transparent;"
                    "color: black;"
                    "}";

            // 提前设置好 lab 的样式
            QString labStyle =
                    "QLabel {"
                    "font-size: 14px;"
                    "font-weight: 500;"
                    "border: none;"
                    "background-color: transparent;"
                    "color: black;"
                    "}";

            // 提前设置 mod 按钮的样式
            QString modBtnStyle =
                    "QPushButton {"
                    "border: none;"
                    "background-color: transparent;"
                    "}"
                    "QPushButton:pressed {"
                    "background-color: rgb(210, 210, 210);"
                    "}";

            // 提前设置 sub 按钮的样式
            QString SubBtnStyle =
                    "QPushButton {"
                    "border: none;"
                    "background-color: transparent;"
                    "}"
                    "QPushButton:pressed {"
                    "background-color: rgb(210, 210, 210);"
                    "}";

            // 提前设置 edit 编辑区的样式
            QString editStyle =
                    "QLineEdit {"
                    "color: white;"
                    "border: none;"
                    "background-color: black;"
                    "border-radius: 5px;"
                    "padding-left: 2px;"
                    "}";

            groupNameTag_->setStyleSheet(tagStyle);
            groupNameLab_->setStyleSheet(labStyle);
            groupNameEdit_->setStyleSheet(editStyle);
            groupNameModifyBtn_->setStyleSheet(modBtnStyle);
            groupNameSubmitBtn_->setStyleSheet(SubBtnStyle);
        }

        // 设置组件布局方法
        void setElementLayout() {
            // 设置滚动区域内部的布局
            gLayoutOfContainer_->setSpacing(0);
            gLayoutOfContainer_->setContentsMargins(0, 0, 0, 0);
            gLayoutOfContainer_->setAlignment(Qt::AlignTop | Qt::AlignLeft); // NOTE: 使得后续加入的元素偏左上角位置
            container_->setLayout(gLayoutOfContainer_);

            auto adder = model::UserModel::makeUser("添加", "", "", QIcon(":/window/window_middle/add_friend_button.png"));
            auto groupChatSessionDetailWidgetItem = new GroupChatSessionDetailWidgetItem(adder, this);
            this->addMember(groupChatSessionDetailWidgetItem);

            // 设置群聊昵称显示区布局
            auto hLayout = new QHBoxLayout();
            hLayout->addWidget(groupNameTag_);
            hLayout->addWidget(groupNameLab_);
            hLayout->addWidget(groupNameEdit_);
            hLayout->addWidget(groupNameModifyBtn_);
            hLayout->addWidget(groupNameSubmitBtn_);

            // 设置整体布局
            auto vLayout = new QVBoxLayout();
            vLayout->setSpacing(10);
            vLayout->setContentsMargins(15, 0, 15, 0);
            vLayout->setAlignment(Qt::AlignCenter); // NOTE: 确保添加的子部件的大小策略支持调整大小, 例如使用 setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding) 才可以使用
            vLayout->addWidget(scrollArea_, 0, Qt::AlignCenter);
            vLayout->addLayout(hLayout);
            vLayout->addWidget(exitGroupBtn_, 0, Qt::AlignCenter);
            this->setLayout(vLayout);
        }

        // 设置信号槽方法
        void setElementSignalSlot() {
            connect(groupNameModifyBtn_, &QPushButton::clicked, this, [=]() {
                // 切换按钮
                groupNameModifyBtn_->hide();
                groupNameSubmitBtn_->show();

                // 覆盖部件
                groupNameLab_->hide();
                groupNameEdit_->show();

                // 初始文本
                groupNameEdit_->setText(groupNameLab_->text());
            });
            connect(groupNameSubmitBtn_, &QPushButton::clicked, this, [=](){
                // 切换按钮
                groupNameSubmitBtn_->hide();
                groupNameModifyBtn_->show();

                // 覆盖部件
                groupNameEdit_->hide();
                groupNameLab_->show();

                // 修改文本
                QString nickNameText = groupNameEdit_->text();
                if (!nickNameText.isEmpty()) {
                    // TODO: 检验提交表单
                    groupNameLab_->setText(nickNameText);
                }

                // 更新数据
                // TODO: 异步更新远端服务器
            });
        }

        // 设置数据处理方法
        void setElementData() {
            // TODO: 请求关于群聊的所有成员列表, 下面都是模拟响应的数据
            // 模拟请求成员数据，生成多个用户
            for (int i = 1; i <= 30; ++i) {
                QString userName = QString("user%1").arg(i);
                QString phoneNumber = QString("135442000%1").arg(i);
                QString nickName = QString("昵称%1").arg(i);
                QIcon avatarIcon = QIcon(QString(":/test/limou.png")); // 假设有这些头像资源

                auto userModel = model::UserModel::makeUser(userName, phoneNumber, nickName, avatarIcon);
                auto groupChatSessionDetailWidgetItem = new GroupChatSessionDetailWidgetItem(userModel, this);
                this->addMember(groupChatSessionDetailWidgetItem);
            }
        }
    };
} // namespace chat_system::subassembly end
// <<< class GroupChatSessionDetailWidget end <<<

#endif //FRONTEND_GROUPCHATSESSIONDETAILWIDGET_HPP
